package com.pe.pgn.clubpgn.dao.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.DocumentoMovArticuloDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmStockAlmacenCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNAsignacionArticuloCatalogoDetalle;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Repository("documentoMovArticuloDao")
public class DocumentoMovArticuloDaoImpl extends
		GenericDaoHibernate<ClpbDocumentoMovArticulo, Long> implements
		DocumentoMovArticuloDao {

	public DocumentoMovArticuloDaoImpl() {
		super(ClpbDocumentoMovArticulo.class);
	}

	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@SuppressWarnings("unchecked")
	public List<ClpbDocumentoMovArticulo> busquedaDocumentoMovimientoPorFiltros(
			String deDocumento, Long coAlmacenOrigen, Long coAlmacenDestino) {
	
		System.out.println(deDocumento);
		System.out.println(coAlmacenDestino);
		System.out.println(coAlmacenOrigen);
		StringBuffer query = new StringBuffer();
		/*
		 * query.append("select a.id as id, ");
		 * query.append("		a.nu_documento as nuDocumento, ");
		 * query.append("		a.co_almacen_origen  as clpbAlmacenOrigen, ");
		 * query.append("		a.co_almacen_destino as clpbAlmacenDestino ");
		 * query.append("	from clpb_documento_mov_articulo a ");
		 * query.append("	where 1 = 1 ");
		 */
		query.append("select a.id as id ");
		// query.append("		a.nu_documento as nuDocumento, ");
		// query.append("		a.co_almacen_origen  as clpbAlmacenOrigen, ");
		// query.append("		a.co_almacen_destino as clpbAlmacenDestino ");
		query.append("	from clpb_documento_mov_articulo a ");
		// query.append("	left join clpb_almacen almacen  on almacen.id= a.co_almacen_origen ");
		query.append("	where 1 = 1 ");

		if (StringUtils.isNotBlank(deDocumento)) {
			query.append("		and upper(trim(a.de_documento)) like '%").append(
					deDocumento.trim().toUpperCase()).append("%'");
		}

		
		if (coAlmacenOrigen.intValue() > 0) {
			query.append("		and a.co_almacen_origen = ")
					.append(coAlmacenOrigen);
		}

		if (coAlmacenDestino.intValue() > 0) {
			query.append("		and a.co_almacen_destino = ").append(
					coAlmacenDestino);

		}
		
		query.append("		and a.st_documento_mov_articulo = '").append(
				CLPConstantes.ST_VERDADERO).append("'");
		
		query.append("		and a.st_indicador_tipo_documento = '").append(
				CLPConstantes.ST_DOCUMENTO_ASIGNACION_ARTICULO_A_CATALOGO).append("'");
		
		System.out.print(query.toString());
		List lista = jdbcTemplate.queryForList(query.toString());
		List<ClpbDocumentoMovArticulo> listaDocumentos = new ArrayList<ClpbDocumentoMovArticulo>();
		for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
			LinkedHashMap object = (LinkedHashMap) iterator.next();
			String idDocumento = String.valueOf(object.get("id"));
			if (StringUtils.isNotBlank(idDocumento)) {
				ClpbDocumentoMovArticulo documento = obtenerDocumentoMovimiento(Long
						.parseLong(idDocumento));
				listaDocumentos.add(documento);
			}
		}
		System.out.println("LISTAS");
		System.out.println("LA LISTA TIENE" + lista.size());
		System.out.println("LA LISTA TIENE" + listaDocumentos.size());
		return listaDocumentos;
	}

	public void eliminarDocumentoMovimiento(Long id) {

		ClpbDocumentoMovArticulo documento = getHibernateTemplate().get(
				ClpbDocumentoMovArticulo.class, id);

		documento.setStDocumentoMovArticulo(Boolean.FALSE);
		getHibernateTemplate().update(documento);
	}

	
	public void guardarDocumentoMovimiento(ClpbDocumentoMovArticulo documentoMovArticulo) {
		
		ClpmCatalogo catalogo = obtenerCatalogo(documentoMovArticulo.getClpmCatalogo().getId());
		
		
		//Armando el objeto del maestro
		documentoMovArticulo.setDaFechaDocumento(Calendar.getInstance());
		documentoMovArticulo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
		documentoMovArticulo.setDaFechaCreacion(Calendar.getInstance());
		
		documentoMovArticulo.setStDocumentoMovArticulo(Boolean.TRUE);
		documentoMovArticulo.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_ASIGNACION_ARTICULO_A_CATALOGO);
		
		//lo guardamos para darle su referencia a sus detalles
		getHibernateTemplate().saveOrUpdate(documentoMovArticulo);
		
		//Armamos la lista de detalles del maestro
		List<ClpdDocumentoMovArticulo> listaDetalles = new ArrayList<ClpdDocumentoMovArticulo>();

		//Armamos la lista de articulos
		List<ClpdArticulo> listaArticulos = new ArrayList<ClpdArticulo>();

		//Armamos la lista de Transaccion De articulos
		List<ClpmTransaccionArticulo> listaTransacciones = new ArrayList<ClpmTransaccionArticulo>();

		//Armamos la lista de Stock Almacen Catalogo
		List<ClpmStockAlmacenCatalogo> listaStockAlmCat = new ArrayList<ClpmStockAlmacenCatalogo>();
		
		
		for (Iterator<BNAsignacionArticuloCatalogoDetalle> iter = documentoMovArticulo.getDetalle().iterator(); iter.hasNext(); ) {
			BNAsignacionArticuloCatalogoDetalle detDocumento = iter.next();
			ClpdArticulo articulo = obtenerArticulo(detDocumento.getCodigoArticulo());			
			ClprPremioCatalogo premio = obtenerPremio(detDocumento.getCodigoPremio());				
			
			
			//Detalle movimientos del documento
			ClpdDocumentoMovArticulo documentoMov = new ClpdDocumentoMovArticulo();
			
			documentoMov.setClpbDocumento(documentoMovArticulo);
			documentoMov.setClpdArticulo(articulo);	
			documentoMov.setVaStockDisponibleAsignado(detDocumento.getStockDisponibleAsignado());			
			documentoMov.setClprPremio(premio);
			documentoMov.setStDocumentoMovArticulo(Boolean.TRUE);
			documentoMov.setCoAlmacenDestino(documentoMovArticulo.getClpbAlmacenDestino().getId());
			documentoMov.setCoCatalogoDestino(documentoMovArticulo.getClpmCatalogo().getId());
			
			documentoMov.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			documentoMov.setDaFechaCreacion(Calendar.getInstance());
		
			
			//Detalle actualizacion de articulos
			ClpdArticulo articuloActualizado = obtenerArticulo(articulo.getCoCodigoArticulo());
			articuloActualizado.setVaStockActual(articuloActualizado.getVaStockActual().add(documentoMov.getVaStockDisponibleAsignado().negate()));
			articuloActualizado.setVaStockDisponible(articuloActualizado.getVaStockDisponible().add(documentoMov.getVaStockDisponibleAsignado().negate()));
			articuloActualizado.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			articuloActualizado.setDaFechaModificacion(Calendar.getInstance());

			//Detalle de registro de transacciones
			ClpmTransaccionArticulo transaccion = new ClpmTransaccionArticulo();
			transaccion.setClpdArticulo(articuloActualizado);
			transaccion.setCoCodigoArticulo(articuloActualizado.getCoCodigoArticulo());
			transaccion.setStIndicadorTipoMovimiento(CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_MANEJA_STOCK);
			transaccion.setVaCantidad(documentoMov.getVaStockDisponibleAsignado());
			transaccion.setClpbAlmacen(documentoMovArticulo.getClpbAlmacenOrigen());
			transaccion.setClpmCatalogo(catalogo);
			transaccion.setClprPremio(premio);
			transaccion.setCoCodigoPremio(premio.getCoCodigoPremio());
			transaccion.setClpbDocumentoMovArticulo(documentoMovArticulo);			
			transaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			transaccion.setDaFechaCreacion(Calendar.getInstance());
		
			//Detalle de STOCK ALMACEN CATALOGO
			ClpmStockAlmacenCatalogo sacBean = obtenerStockAlmCata(articulo.getId(), documentoMovArticulo.getClpbAlmacenOrigen().getId());
			

				//Se actualiza el stock disponible catalogo para ese almacen sin "catalogo"
				System.out.println("si existe");
				StringBuffer query = new StringBuffer();
				query.append(" update clpm_stock_almacen_catalogo ");
				query.append(" set ");
				query.append(" 		va_cantidad = va_cantidad - ").append(documentoMov.getVaStockDisponibleAsignado()).append(" ,");
				query.append(" 		co_usuario_modificador =  '").append(getUsuarioLogueado().getUsername()).append("' ");
				query.append(" where 1 = 1  ");
				query.append(" and co_articulo = ").append(documentoMov.getClpdArticulo().getId());
				query.append(" and co_almacen = ").append(documentoMovArticulo.getClpbAlmacenOrigen().getId());
				jdbcTemplate.update(query.toString());
				
				//Verificar la existencia del registro con el catalogo.
				ClpmStockAlmacenCatalogo stocAlCat = obtenerStockAlmCata(articulo.getId(),documentoMovArticulo.getClpbAlmacenDestino().getId() , documentoMovArticulo.getClpmCatalogo().getId());
				if (null == stocAlCat){
					//No Existe el registro con el articulo, almacen y catalogo (INSERT)
					ClpmStockAlmacenCatalogo sAlmCatcBean = new ClpmStockAlmacenCatalogo();
					sAlmCatcBean.setClpdArticulo(articulo);
					sAlmCatcBean.setClpbAlmacen(documentoMovArticulo.getClpbAlmacenDestino());
					sAlmCatcBean.setClpmCatalogo(catalogo);
					sAlmCatcBean.setVaCantidad(documentoMov.getVaStockDisponibleAsignado());
					/*CONSULTAR A SUSAN
					sAlmCatcBean.setVaComprometido();
					sAlmCatcBean.setVaStockCatalogo();
					sAlmCatcBean.setVaStockCatalogoEspejo();
					 **/
					sAlmCatcBean.setStStockAlmacenCatalogo(Boolean.TRUE);					
					sAlmCatcBean.setClprPremioCatalogo(premio);
					sAlmCatcBean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					sAlmCatcBean.setDaFechaCreacion(Calendar.getInstance());
					
			//lista Stock Catalogo Almacen
			listaStockAlmCat.add(sAlmCatcBean);
			
				} else {
					//Si Existe el registro con el articulo, almacen y catalogo (UPDAT)
					StringBuffer querySac = new StringBuffer();
					
					querySac.append(" update clpm_stock_almacen_catalogo ");
					querySac.append(" set ");
					querySac.append(" 		va_cantidad = va_cantidad + ").append(documentoMov.getVaStockDisponibleAsignado()).append(" ,");
					querySac.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ");
//CONSULTAR ESTE ERROR		querySac.append(" ,		da_fecha_modificacion = ").append(Calendar.getInstance()).append(" ");
					querySac.append(" where  ");
					querySac.append("  co_articulo = ").append(articulo.getId()).append(" ");
					querySac.append("  and co_almacen = ").append(documentoMovArticulo.getClpbAlmacenDestino().getId()).append(" ");
					querySac.append("  and co_catalogo = ").append(catalogo.getId()).append(" )");
					System.out.println("queri que actualiza inserta Si Existe el registro con el articulo, almacen y catalogo (update)");
					System.out.println(querySac.toString());
					jdbcTemplate.update(querySac.toString());
				}
				
			
			//lista de detalle de movimientos
			listaDetalles.add(documentoMov);		
			
			//lista de articulos para actualizar stock y stock Disponible
			listaArticulos.add(articuloActualizado);		

			//lista de transacciones
			listaTransacciones.add(transaccion);		

		}
		
		

		getHibernateTemplate().saveOrUpdateAll(listaDetalles);
		getHibernateTemplate().saveOrUpdateAll(listaArticulos);
		getHibernateTemplate().saveOrUpdateAll(listaTransacciones);
		getHibernateTemplate().saveOrUpdateAll(listaStockAlmCat);
		getHibernateTemplate().flush();		
	}
		

	
	
	public void guardarDocumentoDevolucion(
			ClpbDocumentoMovArticulo documentoMovArticulo) {
		// GUARDANDO EL DOCUMENTO DE DEVOLUCION A PROVEEDORES
		
		
		Map map = new HashMap();
		
		//Armando el objeto del maestro
		documentoMovArticulo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
		documentoMovArticulo.setDaFechaCreacion(Calendar.getInstance());
		documentoMovArticulo.setDaFechaDocumento(Calendar.getInstance());
		
		documentoMovArticulo.setStDocumentoMovArticulo(Boolean.TRUE);
		documentoMovArticulo.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_PROVEEDOR);
		
		//lo guardamos para darle su referencia a sus detalles
		getHibernateTemplate().saveOrUpdate(documentoMovArticulo);

		
		//Armamos la lista de detalles del maestro
		List<ClpdDocumentoMovArticulo> listaDetalles = new ArrayList<ClpdDocumentoMovArticulo>();

		//Armamos la lista de articulos para actuazlizar stock / stock disponible
		List<ClpdArticulo> listaArticulos = new ArrayList<ClpdArticulo>();
		
		//Armamos la lista de Transaccion De articulos
		List<ClpmTransaccionArticulo> listaTransacciones = new ArrayList<ClpmTransaccionArticulo>();
		

		for (Iterator<BNArticulo> iter = documentoMovArticulo.getArticulosDetalle().iterator(); iter.hasNext(); ) {
			BNArticulo articulo = iter.next();	
			ClpdDocumentoMovArticulo documentoMov = new ClpdDocumentoMovArticulo();
			BNAsignacionArticuloCatalogoDetalle detalle = new BNAsignacionArticuloCatalogoDetalle();
			detalle.setCodigoArticulo(articulo.getCoCodigoArticulo());
			ClpdArticulo articuloBean = obtenerArticulo(detalle);
			documentoMov.setClpdArticulo(articuloBean);
			documentoMov.setClpbDocumento(documentoMovArticulo);
			documentoMov.setStDocumentoMovArticulo(Boolean.TRUE);
			documentoMov.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			documentoMov.setDaFechaCreacion(Calendar.getInstance());
			documentoMov.setVaCantidad(articulo.getVaCantidad());
			
			
			//articulo
			ClpdArticulo articuloActualizado = obtenerArticulo(detalle);
			articuloActualizado.setVaStockActual(articuloActualizado.getVaStockActual().add(documentoMov.getVaCantidad().negate()));
			articuloActualizado.setVaStockDisponible(articuloActualizado.getVaStockDisponible().add(documentoMov.getVaCantidad().negate()));
			articuloActualizado.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			articuloActualizado.setDaFechaModificacion(Calendar.getInstance());
			
			
			//transacciones
			ClpmTransaccionArticulo transaccion = new ClpmTransaccionArticulo();
			transaccion.setClpdArticulo(articuloActualizado);
			transaccion.setClpbDocumentoMovArticulo(documentoMovArticulo);
			transaccion.setCoCodigoArticulo(articuloActualizado.getCoCodigoArticulo());
			transaccion.setStIndicadorTipoMovimiento(CLPConstantes.DEVOLUCION_DE_ARTICULO_A_PROVEEDOR);
			transaccion.setVaCantidad(documentoMov.getVaCantidad());
			transaccion.setClpbAlmacen(documentoMovArticulo.getClpbAlmacen());
			transaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			transaccion.setDaFechaCreacion(Calendar.getInstance());
			
			
			//Actualizando Stock Almacen Catalogo
			//UPDATES
			
			StringBuffer query = new StringBuffer();
			query.append(" update clpm_stock_almacen_catalogo ");
			query.append(" set ");
			query.append(" 		va_cantidad = va_cantidad - ").append(articulo.getVaCantidad());
			query.append(" where 1 = 1  ");
			query.append(" and co_articulo = ").append(documentoMov.getClpdArticulo().getId());
			query.append(" and co_almacen = ").append(documentoMovArticulo.getClpbAlmacen().getId());
			query.append(" and co_catalogo  is null ");
			jdbcTemplate.update(query.toString());


			//Lista del detalle de movimientos
			listaDetalles.add(documentoMov);	
			//Lista de actualizacion de articulos
			listaArticulos.add(articuloActualizado);
			//Lista de transacciones
			listaTransacciones.add(transaccion);			
		}

		
		getHibernateTemplate().saveOrUpdateAll(listaDetalles);
		getHibernateTemplate().saveOrUpdateAll(listaArticulos);
		getHibernateTemplate().saveOrUpdateAll(listaTransacciones);
		getHibernateTemplate().flush();		
		
	}

	public ClpbDocumentoMovArticulo obtenerDocumentoMovimiento(Long id) {
		Criteria criteria = DetachedCriteria.forClass(ClpbDocumentoMovArticulo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("id", id));		
	
		List<ClpbDocumentoMovArticulo> documentos = criteria.list();
		if(!documentos.isEmpty()){
			return documentos.get(0);
		}
		return null;
	}

	public List<ClpbDocumentoMovArticulo> obtenerDocumentoMovimientos() {
		
		Criteria criteria = DetachedCriteria.forClass(
				ClpbDocumentoMovArticulo.class).getExecutableCriteria(
				getSessionFactory().getCurrentSession());

		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		criteria.add(Restrictions.eq("stIndicadorTipoDocumento", CLPConstantes.ST_DOCUMENTO_ASIGNACION_ARTICULO_A_CATALOGO));
		criteria.add(Restrictions.eq("stDocumentoMovArticulo", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));

		List<ClpbDocumentoMovArticulo> lista = criteria.list();
		return lista;
	}

	public int guardarAsignarArticulo(
			ClpdDocumentoMovArticulo documento, ClpdArticulo articulo,
			ClprPremioCatalogo premio) {
		
		
		
		//se inicia la transaccion para guardar todo el bloque
		getHibernateTemplate().getSessionFactory().getCurrentSession().beginTransaction();
		
		
		if(documento.getId() == null){
			documento.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			documento.setDaFechaCreacion(Calendar.getInstance());
		}
		else{
			documento.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			documento.setDaFechaModificacion(Calendar.getInstance());
		}	
		
				
		try {
			//seteando las variables de catalogo
			documento.setStDocumentoMovArticulo(Boolean.TRUE);
			
			getHibernateTemplate().saveOrUpdate(documento);
			getHibernateTemplate().flush();
			
			
			
			getHibernateTemplate().getSessionFactory().getCurrentSession().getTransaction().commit();
		
			return 1;
		}
		catch (Exception e) {
			log.info(e.getMessage());
			getHibernateTemplate().getSessionFactory().getCurrentSession().getTransaction().rollback();
			return 0;
		}
	}

	public ClpdArticulo obtenerArticulo(BNAsignacionArticuloCatalogoDetalle detalle) {
		
		Criteria criteria = DetachedCriteria.forClass(ClpdArticulo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
			criteria.add(Restrictions.eq("coCodigoArticulo", detalle.getCodigoArticulo().trim()).ignoreCase());		
		
		List<ClpdArticulo> articulos = criteria.list();
		if(!articulos.isEmpty()){
			return articulos.get(0);
		}
		return null;
	}
	
	public ClprPremioCatalogo obtenerPremio(String coCodigoPremio) {
		
		Criteria criteria = DetachedCriteria.forClass(ClprPremioCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
			criteria.add(Restrictions.eq("coCodigoPremio", coCodigoPremio.trim()).ignoreCase());		
		
		List<ClprPremioCatalogo> premios = criteria.list();
		if(!premios.isEmpty()){
			return premios.get(0);
		}
		return null;
	}

	public ClpmStockAlmacenCatalogo obtenerStockAlmCata(
			Long idArticulo,Long idAlmacen,Long idCatalogo) {
		Criteria criteria = DetachedCriteria.forClass(ClpmStockAlmacenCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("clpdArticulo.id", idArticulo));
		criteria.add(Restrictions.eq("clpbAlmacen.id",idAlmacen));
		criteria.add(Restrictions.eq("clpmCatalogo.id", idCatalogo));
		
		List<ClpmStockAlmacenCatalogo> sacat = criteria.list();
		if(!sacat.isEmpty()){
			return sacat.get(0);
		}
		return null;

	}

	public ClpmStockAlmacenCatalogo obtenerStockAlmCata(
			Long idArticulo,Long idAlmacen) {
		
		System.out.println("el articulo es:" + idArticulo);
		System.out.println("el almacen es:" + idAlmacen);
		
		Criteria criteria = DetachedCriteria.forClass(ClpmStockAlmacenCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("clpdArticulo.id", idArticulo));
		criteria.add(Restrictions.eq("clpbAlmacen.id",idAlmacen));
		//criteria.add(Restrictions.eq("clpmCatalogo.id", null));
		
		List<ClpmStockAlmacenCatalogo> sacat = criteria.list();
		if(!sacat.isEmpty()){
			return sacat.get(0);
		}
		return null;

	}
	
	
	public List<ClpbDocumentoMovArticulo> busquedaDocumentoDevolucion(
			Long coAlmacen, String deProveedor, String fechaInicio,
			String fechaFin) {
		Criteria criteria = DetachedCriteria.forClass(ClpbDocumentoMovArticulo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());

		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		if (StringUtils.isNotBlank(deProveedor))
			criteria.add(Restrictions.like("deProveedor", "%"+deProveedor + "%"));
		
		try {
			
			if(StringUtils.isNotBlank(fechaInicio) && StringUtils.isNotBlank(fechaFin))
				criteria.add(Restrictions.between("daFechaDocumento", CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaInicio), 
						CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaFin)));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		if (coAlmacen>0)
			criteria.add(Restrictions.like("clpbAlmacen.id", coAlmacen));
		
		
		criteria.add(Restrictions.eq("stIndicadorTipoDocumento", CLPConstantes.ST_DOCUMENTO_DEVOLUCION_PROVEEDOR));
		criteria.add(Restrictions.eq("stDocumentoMovArticulo", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
		
        return (List<ClpbDocumentoMovArticulo>) criteria.list();
	}

	public List<ClpbDocumentoMovArticulo> listaDocumentoDevolucion() {
		// Lista los documentos de devolucion al inicio
		Criteria criteria = DetachedCriteria.forClass(ClpbDocumentoMovArticulo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());

		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		criteria.add(Restrictions.eq("stIndicadorTipoDocumento", CLPConstantes.ST_DOCUMENTO_DEVOLUCION_PROVEEDOR));
		criteria.add(Restrictions.eq("stDocumentoMovArticulo", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
		
        return (List<ClpbDocumentoMovArticulo>) criteria.list();		
	}

	public ClpbAlmacen obtenerAlmacen(Long idAlmacen) {
		Criteria criteria = DetachedCriteria.forClass(ClpbAlmacen.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("id", idAlmacen));
		List<ClpbAlmacen> sacat = criteria.list();
		if(!sacat.isEmpty()){
			return sacat.get(0);
		}
		return null;
	}

	public ClpdArticulo obtenerArticulo(String coCodigoArticulo) {
		// TODO Auto-generated method stub
		Criteria criteria = DetachedCriteria.forClass(ClpdArticulo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("coCodigoArticulo", coCodigoArticulo.trim()).ignoreCase());		
	
		List<ClpdArticulo> articulos = criteria.list();
		if(!articulos.isEmpty()){
			return articulos.get(0);
		}
		return null;

	}
	
	public ClpmCatalogo obtenerCatalogo(Long idCatalogo) {
		// TODO Auto-generated method stub
		Criteria criteria = DetachedCriteria.forClass(ClpmCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("id", idCatalogo));		
	
		List<ClpmCatalogo> catalogos = criteria.list();
		if(!catalogos.isEmpty()){
			return catalogos.get(0);
		}
		return null;

	}
}
